--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
scripts/argos_translate.py 3f7ef731b5effd9aa3a81eceea66fd6c2b56498c (3f7ef731) Text, 9.06 KB
T8b949e#!/usr/bin/env python3
T8b949e"""Argos Translate JSON localization script.
This script provides an automated workflow to translate JSON localization files
(such as en.json) to target languages using Argos Translate. It ensures that
interpolated variables (e.g., {count}, {status}) are preserved and not
altered during the translation process.
Requirements:
- argostranslate (pip install argostranslate)
Usage:
python scripts/argos_translate.py --from en --to zh --input locales/en.json --output locales/zh.json
You can also use environment variables instead of CLI flags:
ARGOS_FROM_LANG="en"
ARGOS_TO_LANG="zh"
ARGOS_INPUT_FILE="locales/en.json"
ARGOS_OUTPUT_FILE="locales/zh.json"
"""
Tff7b72import T7ee787argparse
Tff7b72import T7ee787json
Tff7b72import T7ee787os
Tff7b72import T7ee787re
Tff7b72import T7ee787sys
Tff7b72import T7ee787time
T8b949e# ANSI color codes for terminal output
Tff7b72class T56d364ColorsTb4b4b4:
Te6edf3HEADER Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[95mTa5d6ff"
Te6edf3OKBLUE Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[94mTa5d6ff"
Te6edf3OKCYAN Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[96mTa5d6ff"
Te6edf3OKGREEN Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[92mTa5d6ff"
Te6edf3WARNING Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[93mTa5d6ff"
Te6edf3FAIL Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[91mTa5d6ff"
Te6edf3ENDC Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[0mTa5d6ff"
Te6edf3BOLD Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[1mTa5d6ff"
Te6edf3UNDERLINE Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[4mTa5d6ff"
Tff7b72def Td2a8ffprint_infoTb4b4b4(Te6edf3msgTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3ColorsTff7b72.Td2a8ffOKCYANTffd700}Ta5d6ff[INFO]Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff Tffd700{Te6edf3msgTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffprint_successTb4b4b4(Te6edf3msgTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3ColorsTff7b72.Td2a8ffOKGREENTffd700}Ta5d6ff[SUCCESS]Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff Tffd700{Te6edf3msgTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffprint_warningTb4b4b4(Te6edf3msgTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3ColorsTff7b72.Td2a8ffWARNINGTffd700}Ta5d6ff[WARNING]Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff Tffd700{Te6edf3msgTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffprint_errorTb4b4b4(Te6edf3msgTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3ColorsTff7b72.Td2a8ffFAILTffd700}Ta5d6ff[ERROR]Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff Tffd700{Te6edf3msgTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72import T7ee787argostranslateT7ee787.T7ee787package
Tff7b72import T7ee787argostranslateT7ee787.T7ee787translate
Tff7b72except Tf85149ImportErrorTb4b4b4:
Te6edf3print_errorTb4b4b4(Ta5d6ff"Ta5d6ffThe Ta5d6ff'Ta5d6ffargostranslateTa5d6ff'Ta5d6ff module is not installed.Ta5d6ff"Tb4b4b4)
Te6edf3print_infoTb4b4b4(Ta5d6ff"Ta5d6ffPlease install it using: pip install argostranslateTa5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72def Td2a8ffensure_package_installedTb4b4b4(Te6edf3from_codeTb4b4b4, Te6edf3to_codeTb4b4b4)Tb4b4b4:
T8b949e"""Ensure the translation package from from_code to to_code is installed.
If not installed, attempts to download and install it automatically.
"""
Te6edf3installed Tff7b72= Te6edf3argostranslateTff7b72.Td2a8fftranslateTff7b72.Td2a8ffget_installed_languagesTb4b4b4(Tb4b4b4)
Te6edf3installed_dict Tff7b72= Tb4b4b4{Te6edf3langTff7b72.Td2a8ffcodeTb4b4b4: Te6edf3lang Tff7b72for Te6edf3lang Tff7b72in Te6edf3installedTb4b4b4}
Te6edf3from_lang Tff7b72= Te6edf3installed_dictTff7b72.Td2a8ffgetTb4b4b4(Te6edf3from_codeTb4b4b4)
Te6edf3to_lang Tff7b72= Te6edf3installed_dictTff7b72.Td2a8ffgetTb4b4b4(Te6edf3to_codeTb4b4b4)
Tff7b72if Tff7b72not Te6edf3from_lang Tff7b72or Tff7b72not Te6edf3to_lang Tff7b72or Te6edf3to_lang Tff7b72not Tff7b72in Te6edf3from_langTff7b72.Td2a8fftranslations_fromTb4b4b4:
Te6edf3print_warningTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffTranslation package Tffd700{Te6edf3from_codeTffd700}Ta5d6ff -> Tffd700{Te6edf3to_codeTffd700}Ta5d6ff not found. Attempting to install...Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3argostranslateTff7b72.Td2a8ffpackageTff7b72.Td2a8ffupdate_package_indexTb4b4b4(Tb4b4b4)
Te6edf3available_packages Tff7b72= Te6edf3argostranslateTff7b72.Td2a8ffpackageTff7b72.Td2a8ffget_available_packagesTb4b4b4(Tb4b4b4)
Te6edf3pkg_to_install Tff7b72= Tff7b72None
Tff7b72for Te6edf3pkg Tff7b72in Te6edf3available_packagesTb4b4b4:
Tff7b72if Te6edf3pkgTff7b72.Td2a8fffrom_code Tff7b72== Te6edf3from_code Tff7b72and Te6edf3pkgTff7b72.Td2a8ffto_code Tff7b72== Te6edf3to_codeTb4b4b4:
Te6edf3pkg_to_install Tff7b72= Te6edf3pkg
Tff7b72break
Tff7b72if Te6edf3pkg_to_installTb4b4b4:
Te6edf3print_infoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDownloading package: Tffd700{Te6edf3pkg_to_installTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3argostranslateTff7b72.Td2a8ffpackageTff7b72.Td2a8ffinstall_from_pathTb4b4b4(Te6edf3pkg_to_installTff7b72.Td2a8ffdownloadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3print_successTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffSuccessfully installed package: Tffd700{Te6edf3from_codeTffd700}Ta5d6ff -> Tffd700{Te6edf3to_codeTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
T8b949e# Refresh installed languages
Te6edf3installed Tff7b72= Te6edf3argostranslateTff7b72.Td2a8fftranslateTff7b72.Td2a8ffget_installed_languagesTb4b4b4(Tb4b4b4)
Te6edf3installed_dict Tff7b72= Tb4b4b4{Te6edf3langTff7b72.Td2a8ffcodeTb4b4b4: Te6edf3lang Tff7b72for Te6edf3lang Tff7b72in Te6edf3installedTb4b4b4}
Tff7b72elseTb4b4b4:
Te6edf3print_errorTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffCould not find a translation package for Tffd700{Te6edf3from_codeTffd700}Ta5d6ff -> Tffd700{Te6edf3to_codeTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3print_errorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFailed to install language package: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72return Te6edf3installed_dictTff7b72.Td2a8ffgetTb4b4b4(Te6edf3from_codeTb4b4b4)Tb4b4b4, Te6edf3installed_dictTff7b72.Td2a8ffgetTb4b4b4(Te6edf3to_codeTb4b4b4)
Tff7b72def Td2a8ffget_translation_funcTb4b4b4(Te6edf3from_codeTb4b4b4, Te6edf3to_codeTb4b4b4)Tb4b4b4:
T8b949e"""Returns a translation function for the specified language pair."""
Te6edf3from_langTb4b4b4, Te6edf3to_lang Tff7b72= Te6edf3ensure_package_installedTb4b4b4(Te6edf3from_codeTb4b4b4, Te6edf3to_codeTb4b4b4)
Te6edf3translator Tff7b72= Te6edf3from_langTff7b72.Td2a8ffget_translationTb4b4b4(Te6edf3to_langTb4b4b4)
Tff7b72if Tff7b72not Te6edf3translatorTb4b4b4:
Te6edf3print_errorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo translation available from Tffd700{Te6edf3from_codeTffd700}Ta5d6ff to Tffd700{Te6edf3to_codeTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72return Te6edf3translatorTff7b72.Td2a8fftranslate
Tff7b72def Td2a8ffreplace_vars_with_tokensTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4:
T8b949e"""Replaces {variable} patterns with a standard token like XVAR0X.
So the translation engine doesn't attempt to translate variable names.
Returns the modified text and the list of found variables.
"""
Te6edf3vars_found Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72def Td2a8ffreplacerTb4b4b4(Te6edf3matchTb4b4b4)Tb4b4b4:
Te6edf3vars_foundTff7b72.Td2a8ffappendTb4b4b4(Te6edf3matchTff7b72.Td2a8ffgroupTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4)
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff XVARTffd700{Tffa657lenTb4b4b4(Te6edf3vars_foundTb4b4b4) Tff7b72- T79c0ff1Tffd700}Ta5d6ffX Ta5d6ff"
Te6edf3replaced_text Tff7b72= Te6edf3reTff7b72.Td2a8ffsubTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff\Ta5d6ff{Ta5d6ff+.*?Ta5d6ff\Ta5d6ff}+Ta5d6ff"Tb4b4b4, Te6edf3replacerTb4b4b4, Te6edf3textTb4b4b4)
Tff7b72return Te6edf3replaced_textTb4b4b4, Te6edf3vars_found
Tff7b72def Td2a8ffrestore_vars_from_tokensTb4b4b4(Te6edf3textTb4b4b4, Te6edf3vars_foundTb4b4b4)Tb4b4b4:
T8b949e"""Restores the original {variable} patterns back into the translated text.
Looks for the XVAR0X tokens.
"""
Tff7b72for Te6edf3iTb4b4b4, Te6edf3var Tff7b72in Tffa657enumerateTb4b4b4(Te6edf3vars_foundTb4b4b4)Tb4b4b4:
T8b949e# The translation engine might change case or spacing around the token
Te6edf3text Tff7b72= Te6edf3reTff7b72.Td2a8ffsubTb4b4b4(Ta5d6ffrfTa5d6ff"Ta5d6ff\Ta5d6ffs*[xX][vV][aA][rR]Tffd700{Te6edf3iTffd700}Ta5d6ff[xX]Ta5d6ff\Ta5d6ffs*Ta5d6ff"Tb4b4b4, Te6edf3varTb4b4b4, Te6edf3textTb4b4b4)
Tff7b72return Te6edf3textTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftranslate_dictTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3translate_funcTb4b4b4, Te6edf3target_nameTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""Recursively iterates over a dictionary and translates all string values.
Skips the _languageName key, which can be explicitly set.
"""
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Te6edf3new_dict Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Te6edf3dataTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3k Tff7b72== Ta5d6ff"Ta5d6ff_languageNameTa5d6ff" Tff7b72and Te6edf3target_nameTb4b4b4:
Te6edf3new_dictTb4b4b4[Te6edf3kTb4b4b4] Tff7b72= Te6edf3target_name
Tff7b72continue
Tff7b72if Te6edf3k Tff7b72== Ta5d6ff"Ta5d6ff_languageNameTa5d6ff"Tb4b4b4:
T8b949e# Keep original if no target name provided
Te6edf3new_dictTb4b4b4[Te6edf3kTb4b4b4] Tff7b72= Te6edf3v
Tff7b72continue
Te6edf3new_dictTb4b4b4[Te6edf3kTb4b4b4] Tff7b72= Te6edf3translate_dictTb4b4b4(Te6edf3vTb4b4b4, Te6edf3translate_funcTb4b4b4, Te6edf3target_nameTb4b4b4)
Tff7b72return Te6edf3new_dict
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4[Te6edf3translate_dictTb4b4b4(Te6edf3itemTb4b4b4, Te6edf3translate_funcTb4b4b4, Te6edf3target_nameTb4b4b4) Tff7b72for Te6edf3item Tff7b72in Te6edf3dataTb4b4b4]
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3dataTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3data
Te6edf3temp_textTb4b4b4, Te6edf3vars_found Tff7b72= Te6edf3replace_vars_with_tokensTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3translated_temp Tff7b72= Te6edf3translate_funcTb4b4b4(Te6edf3temp_textTb4b4b4)
Tff7b72return Te6edf3restore_vars_from_tokensTb4b4b4(Te6edf3translated_tempTb4b4b4, Te6edf3vars_foundTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3print_warningTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffFailed to translate Ta5d6ff'Tffd700{Te6edf3dataTffd700}Ta5d6ff'Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff. Falling back to original.Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3data
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3data
Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(
Te6edf3descriptionTff7b72=Ta5d6ff"Ta5d6ffTranslate JSON localization files using Argos Translate.Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff--fromTa5d6ff"Tb4b4b4,
Te6edf3destTff7b72=Ta5d6ff"Ta5d6fffrom_langTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffSource language code (e.g. Ta5d6ff'Ta5d6ffenTa5d6ff'Ta5d6ff)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--toTa5d6ff"Tb4b4b4, Te6edf3destTff7b72=Ta5d6ff"Ta5d6ffto_langTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffTarget language code (e.g. Ta5d6ff'Ta5d6ffzhTa5d6ff'Ta5d6ff)Ta5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--inputTa5d6ff"Tb4b4b4, Te6edf3destTff7b72=Ta5d6ff"Ta5d6ffinput_fileTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffPath to input JSON fileTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--outputTa5d6ff"Tb4b4b4, Te6edf3destTff7b72=Ta5d6ff"Ta5d6ffoutput_fileTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffPath to output JSON fileTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff--nameTa5d6ff"Tb4b4b4,
Te6edf3destTff7b72=Ta5d6ff"Ta5d6fftarget_nameTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffNative name of the target language (e.g. Ta5d6ff'Ta5d6ff中文Ta5d6ff'Ta5d6ff for Chinese)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
T8b949e# Fallback to Environment Variables if arguments aren't provided
Te6edf3from_lang Tff7b72= Te6edf3argsTff7b72.Td2a8fffrom_lang Tff7b72or Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffARGOS_FROM_LANGTa5d6ff"Tb4b4b4)
Te6edf3to_lang Tff7b72= Te6edf3argsTff7b72.Td2a8ffto_lang Tff7b72or Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffARGOS_TO_LANGTa5d6ff"Tb4b4b4)
Te6edf3input_file Tff7b72= Te6edf3argsTff7b72.Td2a8ffinput_file Tff7b72or Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffARGOS_INPUT_FILETa5d6ff"Tb4b4b4)
Te6edf3output_file Tff7b72= Te6edf3argsTff7b72.Td2a8ffoutput_file Tff7b72or Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffARGOS_OUTPUT_FILETa5d6ff"Tb4b4b4)
Te6edf3target_name Tff7b72= Te6edf3argsTff7b72.Td2a8fftarget_name Tff7b72or Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffARGOS_TARGET_NAMETa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657allTb4b4b4(Tb4b4b4[Te6edf3from_langTb4b4b4, Te6edf3to_langTb4b4b4, Te6edf3input_fileTb4b4b4, Te6edf3output_fileTb4b4b4]Tb4b4b4)Tb4b4b4:
Te6edf3parserTff7b72.Td2a8ffprint_helpTb4b4b4(Tb4b4b4)
Te6edf3print_errorTb4b4b4(
Ta5d6ff"Ta5d6ffMissing required arguments. Please provide --from, --to, --input, and --output.Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3input_fileTb4b4b4)Tb4b4b4:
Te6edf3print_errorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInput file not found: Tffd700{Te6edf3input_fileTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3print_infoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSource Language: Tffd700{Te6edf3ColorsTff7b72.Td2a8ffBOLDTffd700}Tffd700{Te6edf3from_langTffd700}Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3print_infoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTarget Language: Tffd700{Te6edf3ColorsTff7b72.Td2a8ffBOLDTffd700}Tffd700{Te6edf3to_langTffd700}Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3print_infoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInput File: Tffd700{Te6edf3ColorsTff7b72.Td2a8ffBOLDTffd700}Tffd700{Te6edf3input_fileTffd700}Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3print_infoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffOutput File: Tffd700{Te6edf3ColorsTff7b72.Td2a8ffBOLDTffd700}Tffd700{Te6edf3output_fileTffd700}Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff"Tb4b4b4)
T8b949e# Load JSON
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3input_fileTb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3source_data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadTb4b4b4(Te6edf3fTb4b4b4)
Tff7b72except Te6edf3jsonTff7b72.Td2a8ffJSONDecodeError Tff7b72as Te6edf3eTb4b4b4:
Te6edf3print_errorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid JSON in input file: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3start_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
T8b949e# Get Translator
Te6edf3translate_func Tff7b72= Te6edf3get_translation_funcTb4b4b4(Te6edf3from_langTb4b4b4, Te6edf3to_langTb4b4b4)
Te6edf3print_infoTb4b4b4(
Ta5d6ff"Ta5d6ffStarting translation. This may take a moment depending on the file size...Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3translated_data Tff7b72= Te6edf3translate_dictTb4b4b4(Te6edf3source_dataTb4b4b4, Te6edf3translate_funcTb4b4b4, Te6edf3target_nameTb4b4b4)
T8b949e# Ensure output directory exists
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3output_fileTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
T8b949e# Save translated JSON
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3output_fileTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3jsonTff7b72.Td2a8ffdumpTb4b4b4(Te6edf3translated_dataTb4b4b4, Te6edf3fTb4b4b4, Te6edf3ensure_asciiTff7b72=Tff7b72FalseTb4b4b4, Te6edf3indentTff7b72=T79c0ff4Tb4b4b4)
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149OSError Tff7b72as Te6edf3eTb4b4b4:
Te6edf3print_errorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not write to output file: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3elapsed_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start_time
Te6edf3print_successTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTranslation complete in Tffd700{Te6edf3elapsed_timeTffd700:Ta5d6ff.2fTffd700}Ta5d6ff seconds!Ta5d6ff"Tb4b4b4)
Te6edf3print_successTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffOutput saved to Tffd700{Te6edf3ColorsTff7b72.Td2a8ffBOLDTffd700}Tffd700{Te6edf3output_fileTffd700}Tffd700{Te6edf3ColorsTff7b72.Td2a8ffENDCTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3mainTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────